package com.rising.memory;


/**
 * @author LiChenYang
 * @description
 * @date 2022-09-05 17:34
 */
public class StringTest {

    public static void main(String[] args) {
        //以下常量池指的是字符串常量池
        //+ :两边只要有变量，就会调用StringBuilder进行append，被final修饰的不是变量，算是常量
        //+ :两边都是双引号引起来的字符串，编译期优化成一个字符串
        StringTest stringTest = new StringTest();
        stringTest.testString3();
    }

    private void testString1() {
        String a  = "hello";//常量池加一个hello，返回常量池地址
        String b = new String("word");//常量池和堆各加一个word，返回堆的地址
        String g = "word";//直接返回常量池中word的地址
        String c = a + b;//堆里面加一个helloword，返回堆中地址，同时堆里面会增加一个java.lang.StringBuilder
        String d = "helloword";//常量池加一个helloword，返回常量池地址
        String e = "hello" + "word";//编译期优化，直接返回常量池helloword的地址
        String f = "hello" + new String("word");//堆里面生成一个helloword和一个word，返回堆中helloword的地址
        String h = "hello" + g;//堆里面生成一个helloword，返回堆中地址，同时将上一次堆生成的word删掉
        System.out.println(c == d);//false
        System.out.println(c == e);//false
        System.out.println(d == e);//true
        System.out.println(d == f);//false
        System.out.println(d == h);//false
    }

    private void testString2() {
        String a = "hello";//常量池加一个hello，返回常量池地址
        String b = new String("word");//常量池和堆各加一个word，返回堆的地址
        String g = "word";//直接返回常量池中word的地址
        String e = "hello" + new String("word");//堆里面生成一个helloword和一个word，返回堆中helloword的地址
        String f = "hello" + new String("word");//堆里面生成一个helloword和一个word，返回堆中helloword的地址，同时将上一次堆生成的word删掉
        String c = "hello" + g;//堆里面生成一个helloword，返回堆中地址，同时将上一次堆生成的word删掉
        String d = "hello" + g;//堆里面生成一个helloword，返回堆中地址
        System.out.println(c == d);
    }

    private void testString3() {
        String a = "hello";//常量池加一个hello，返回常量池地址
        String b = new String("word");//常量池和堆各加一个word，返回堆的地址
        String c = new String("word");//堆加一个word，返回堆的地址
        String d = new String("word");//堆加一个word，返回堆的地址
        String e = new String("word");//堆加一个word，返回堆的地址
        String f = "hello" + new String("word");
        String h = "hello" + new String("word");
        String i = "hello" + new String("word");
        System.out.println(c == d);
    }
}
